function [x_SA,info_SA] = SA(T_SA,c_SA,verifiche_SA)
//
// Funzione SA: calcola la colonna soluzione del sistema di equazioni lineari
//
//       T_SA x = c_SA
//
// quando la matrice T_SA è N x N triangolare inferiore invertibile e c_SA è una
// colonna di N componenti.
//
// verifiche_SA = "disabilita": la procedura non verifica la conformità dei dati
//                              né l'invertibilità della matrice;
//              = "abilita": la procedura verifica la conformità dei dati
//                           e l'invertibilità della matrice; se qualche
//                           verifica ha esito negativo, si pone x_SA = %nan.
//
// x_SA: se i dati superano le verifiche, x_SA è la soluzione del sistema,
//       altrimenti x_SA = %nan
// info_SA = %nan: l'utente ha richiesto alla procedura di non fare verifiche
//                 sui dati;
//         = -2: opzione non valida per le verifiche (ovvero verifiche_SI
//               diverso da "abilita" e "disabilita");
//         = -1: se le dimensioni dei dati non sono compatibili o la matrice
//               non è triangolare inferiore;
//         =  0: se T_SA(k,k) è nullo (ovvero T_SA non è invertibile);
//         =  1: la procedura ha verificato i dati e determinato la soluzione.
//
[NR, NC] = size(T_SA);
N = NR; // N è il numero di equazioni del sistema
if verifiche_SA == "abilita" then
   //
   // *** Verifica dimensioni e invertibilità
   //
   info_SA = 1; // resta tale solo se tutte le verifiche hanno esito positivo
   if NR ~= NC then info_SA = -1;
      printf("\n *** Errore: matrice non quadrata.\n\n");
   elseif size(c_SA,"r") ~= NR | size(c_SA,"c") ~= 1 then info_SA = -1;
      printf("\n *** Errore: dimensioni termine noto non compatibili.\n\n");
   end;
   if info_SA == 1 & max(abs(triu(T_SA,1))) > 0 then info_SA = -1;
      printf("\n *** Errore: matrice non triangolare inferiore.\n\n");
   end;
   if info_SA == 1 & find(diag(T_SA)==0) ~= [] then info_SA = 0;
      printf("\n *** Errore: elementi nulli sulla diagonale agli indici:\n");
      disp(find(diag(T_SA)==0)); printf("\n");
   end;
   //
   // *** Fine verifica dimensioni e invertibilità
   //
elseif verifiche_SA == "disabilita" then info_SA = %nan;
else printf("\n ***Errore: opzione non valida per verifiche" +...
            " (scelte: abilita/disabilita)\n\n");
     x_SA = %nan; info_SA = -2; return;
end;
if info_SA == 1 | isnan(info_SA) then
   //
   // *** Calcolo soluzione
   //
   x_SA = zeros(N,1);
   //
   x_SA(1) = c_SA(1) / T_SA(1,1);
   for k = 2:N,
       x_SA(k) = (c_SA(k) - T_SA(k,1:k-1)*x_SA(1:k-1)) / T_SA(k,k);
   end;
   //
   // *** Fine calcolo soluzione
   //
else x_SA = %nan; // se qualche verifica ha avuto esito negativo
end
endfunction
